import axios from 'axios'
import store from '@/store'
import router from '@/router'

const request = axios.create({
  baseURL: 'http://edufront.lagou.com/'
})

// 请求时在请求头上添加authorization
// 通过请求连接器进行接口鉴权  -- 设置token？\
request.interceptors.request.use(config => {
  // 没有的话就不请求，有的话进行请求
  const { user } = store.state
  // 检测user是否存在
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})

// 封装函数用于跳转登录页
function routerLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

// 标记token刷新状态
let isRefreshing = false
// 刷新token等待的请求
let requests = []

// 对于快过期的token进行重新获取
request.interceptors.response.use(response => {
  return response
}, async err => {
  console.log(err)
  // 判断错误情况
  // 存在响应，但是出错了
  if (err.response) {
    // 检测状态码是否为 401
    if (err.response.status === 401) {
      // 检测是否存在用户的登录信息
      if (!store.state.user) {
        // 如果不存在，跳转至登录页，然后结束即可
        routerLogin()
        return Promise.reject(err)
      }
      // 发送请求之前判断是否已经存在刷新token了
      if (isRefreshing) {
        return requests.push(() => {
          // err.config指的是请求失败的配置对象
          request(err.config)
        })
      }
      // 请求开始
      isRefreshing = true
      // 发送请求，尝试刷新token
      const { data } = await request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: new window.URLSearchParams({
          refreshtoken: store.state.user.refresh_token
        }).toString()
      })
      // 判断新获取的token状态
      if (data.state !== 1) {
        // 刷新token失败
        store.commit('setUser', null)
        routerLogin()
        return Promise.reject(err)
      }
      // 刷新token成功
      store.commit('setUser', data.content)

      // 将requests中的所有请求重新发送
      requests.forEach(callback => callback())
      requests = []
      isRefreshing = false
    }
  }
  return request(err.config)
})

export default request
